package cc.rengu.oltp.service.realize;

import cc.rengu.oltp.utility.bean.RedisConfig;
import redis.clients.jedis.JedisPubSub;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Redis缓存服务接口类
 * Created by wangc on 2020/12/2.
 */
public interface RedisService {
    /**
     * Redis客户端连接池实例初始化
     *
     * @param redisConfig Redis配置
     * @return Redis客户端连接池实例
     */
    Object redisClientInit(RedisConfig redisConfig);

    /**
     * 设置指定key的数据值
     *
     * @param key   数据KEY
     * @param value 数据VALUE
     * @return true-成功，false-失败
     */
    boolean set(String key, String value);

    /**
     * 设置指定key的数据值，并设置过期时间
     *
     * @param key        数据KEY
     * @param value      数据VALUE
     * @param activeTime 有效期(单位秒)
     * @return true-成功，false-失败
     */
    boolean set(String key, String value, int activeTime);

    /**
     * 获取指定key的数据值
     *
     * @param key 数据KEY
     * @return 数据KEY值，当KEY不存在时，返回NULL
     */
    String get(String key);

    /**
     * 设置指定Key的数据值，并返回设置前的数据值VALUE
     *
     * @param key   数据KEY
     * @param value 数据VALUE
     * @return 设置前的数据VALUE，当设置前KEY不存在时，返回NULL
     */
    String getAndSet(String key, String value);

    /**
     * 为键key储存的数字值加上1
     *
     * @param key 数据KEY
     * @return 键key在执行加1操作之后的值
     */
    long incr(String key);

    /**
     * 为键key储存的数字值减1
     *
     * @param key 数据KEY
     * @return 键key在执行减1操作之后的值
     */
    long decr(String key);

    /**
     * 检查数据KEY是否存在
     *
     * @param key 数据KEY
     * @return true-存在，false-不存在
     */
    boolean exists(String key);

    /**
     * 将指定field的值设置到哈希表
     *
     * @param key   哈希表
     * @param field 数据域
     * @param value 数据VALUE
     * @return true-成功，false-失败
     */
    long hashSet(String key, String field, String value);

    /**
     * 将指定field的数据值设置到哈希表，并设置过期时间
     *
     * @param key        哈希表
     * @param field      数据域
     * @param value      数据VALUE
     * @param activeTime 有效期(单位秒)
     * @return true-成功，false-失败
     */
    long hashSet(String key, String field, String value, int activeTime);

    /**
     * 从哈希表中获取指定field的数据值
     *
     * @param key   哈希表
     * @param field 数据域
     * @return 数据field值，当field不存在时，返回NULL
     */
    String hashGet(String key, String field);

    /**
     * 同时将多个field-value(域-值)对设置到哈希表key中
     *
     * @param key        哈希表
     * @param filedValue 域-值对
     * @return true-成功，false-失败
     */
    boolean hashMultSet(String key, Map<String, String> filedValue);

    /**
     * 返回哈希表key中一个或多个给定域的值
     *
     * @param key    哈希表
     * @param fields 数据域集合
     * @return 数据fields的值
     */
    List<String> hashMultGet(String key, String... fields);

    /**
     * 返回哈希表key中域的数量
     *
     * @param key 哈希表
     * @return 哈希表中域field的数量
     */
    long getHashLen(String key);

    /**
     * 返回哈希表key中一个或多个给定域的值
     *
     * @param key 哈希表
     * @return 哈希表中所有域-值对
     */
    Map<String, String> hashGetAll(String key);

    /**
     * 返回哈希表key中的所有域
     *
     * @param key 哈希表
     * @return 哈希表中所有的field
     */
    Set<String> hashKeys(String key);

    /**
     * 检查数据field是否在哈希表中存在
     *
     * @param key   哈希表
     * @param field 数据域
     * @return true-存在，false-不存在
     */
    boolean hashExists(String key, String field);

    /**
     * 删除哈希表key中给定的一个或者多个field
     *
     * @param key    哈希表
     * @param fields 数据域
     * @return 被删除的field数量
     */
    long hashDelete(String key, String... fields);

    /**
     * 为哈希表key中的域field的值加上增量increment
     *
     * @param key       哈希表
     * @param field     数据域
     * @param increment 增量值，增量也可以为负数，相当于对给定域进行减法操作
     * @return 设置后的值
     */
    long hashIncrease(String key, String field, long increment);

    /**
     * 获取List列表中Key的数量
     *
     * @param key 数据KEY
     * @return 数据KEY的数量
     */
    long getListLen(String key);

    /**
     * 返回列表key中指定区间内的数据，区间以偏移量start和end指定
     *
     * @param key   数据KEY
     * @param start 起始位置
     * @param end   结束位置
     * @return 指定区间的元素
     */
    List<String> listRange(String key, long start, long end);

    /**
     * 对一个列表进行修剪，只保留指定区间内的数据，不在指定区间之内的元素都将被删除
     *
     * @param key   数据KEY
     * @param start 起始位置
     * @param end   结束位置
     * @return true-成功，false-失败
     */
    boolean listTrim(String key, long start, long end);

    /**
     * 将列表key下标为index的元素的值设置为value
     * 当 index 参数超出范围，或对一个空列表( key 不存在)进行 LSET 时，返回一个错误。
     *
     * @param key   数据KEY
     * @param index 索引编号
     * @param value 数据值
     * @return true-成功，false-失败
     */
    boolean listSet(String key, long index, String value);

    /**
     * 返回列表key中下标为index的数据
     *
     * @param key   数据KEY
     * @param index 索引值
     * @return 数据值
     */
    String listGet(String key, long index);

    /**
     * 根据参数count的值，移除列表中与参数value相等的数据
     *
     * @param key   数据KEY
     * @param count 移除顺序及说明
     *              count > 0 : 从表头开始向表尾搜索，移除与 value 相等的元素，数量为 count
     *              count < 0 : 从表尾开始向表头搜索，移除与 value 相等的元素，数量为 count 的绝对值
     *              count = 0 : 移除表中所有与 value 相等的值
     * @param value 移除的值
     * @return 被移除元素的数量
     */
    long listRem(String key, long count, String value);

    /**
     * 将一个或多个值插入到key的List列表的表头，当KEY不存在时，创建一个空列表并执行leftPush操作
     *
     * @param key    数据KEY
     * @param values 待插入的数据
     * @return 插入完成后key在List中的个数
     */
    long listLeftPush(String key, String... values);

    /**
     * 将一个或多个值插入到key的List列表的表头，当KEY不存在时，什么都不操作
     *
     * @param key    数据KEY
     * @param values 待插入的数据
     * @return 插入完成后key在List中的个数
     */
    long listLeftPushX(String key, String... values);

    /**
     * 移除并返回列表key的头元素
     *
     * @param key 数据KEY
     * @return 数据VALUE
     */
    String listLeftPop(String key);

    /**
     * 将一个或多个值插入到key的List列表的表尾，当KEY不存在时，创建一个空列表并执行rightPush操作
     *
     * @param key    数据KEY
     * @param values 待插入的数据
     * @return 插入完成后key在List中的个数
     */
    long listRightPush(String key, String... values);

    /**
     * 将一个或多个值插入到key的List列表的表尾，当KEY不存在时，什么都不操作
     *
     * @param key    数据KEY
     * @param values 待插入的数据
     * @return 插入完成后key在List中的个数
     */
    long listRightPushX(String key, String... values);

    /**
     * 移除并返回列表key的尾元素
     *
     * @param key 数据KEY
     * @return 数据VALUE
     */
    String listRightPop(String key);

    /**
     * 删除给定的一个或者多个KEY
     *
     * @param keys 将要删除的KEY
     * @return 被删除的KEY数量
     */
    long delete(String... keys);

    /**
     * 设置KEY的生存时间
     *
     * @param key        数据KEY
     * @param activeTime 生存时间(单位秒)
     * @return 设置成功的记录数
     */
    long setKeyExpire(String key, int activeTime);

    /**
     * 根据正则表达式查询所有符合条件的key
     *
     * @param pattern 正则表达式
     * @return 匹配到的数据KEY集合
     */
    Set<String> getKeys(String pattern);

    /**
     * 根据正则表达款查询所有符合条件的key
     *
     * @param pattern 正则表达式
     * @return 匹配到的数据KEY集合
     */
    List<String> scan(String pattern);

    /**
     * 将信息message发送到指定的频道channel
     *
     * @param channel 发布频道
     * @param message 发布消息
     * @return 接收到信息message的订阅者数量
     */
    long publish(String channel, String message);

    /**
     * 订阅一个或多个符合给定模式频道的订阅消息
     *
     * @param subscribeListener 订单监听器
     * @param channel           订阅频道
     */
    void psubscribe(JedisPubSub subscribeListener, String channel);
}
